<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de Autor
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Autor extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        //carrega a class DAOAutor
        $this->load->model('DAOAutor');

        //Seta propriedades do template
        $this->template->set('title', 'Cadastro de Autor || ' . $this->title);
        $this->template->set('page_title', 'Cadastro de Autor');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Não é permitido cadastro duplicado de <span class="bold">AUTORES</span>, então verifique se o autor a ser inserido não possui cadastro.</p>
                        <p><span class="bold">Só é possível excluir um AUTOR se ele não estiver relacionado com um ITEM (livro, magazine...).</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar um novo Autor.</p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de autores
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_AUTOR);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $autores = $this->DAOAutor->select_all_authors($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOAutor->amount_all_authors();

            // paginação
            $config['uri_segment'] = 6;
            $config['base_url'] = base_url() . "autor/listar/" . $this->order_by_name . '/'. $this->direction_name . '/' .$total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['autores'] = $autores;
            $data['quant_list'] = $total_pagina;

            $this->template->load(NULL, 'autor_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_autor();
        }
    }

    /**
     * Retorna via json o autor selecionado
     */
    public function get_author() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idAutor", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $autor = new TOAutor();
                $autor->id = $this->input->post('idAutor', TRUE);

                $data['autor'] = $this->DAOAutor->get_author($autor);
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_autor();
        }
    }

    /**
     * Cadastra Autor
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_AUTOR);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[4]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $autor = new TOAutor();
                $autor->nome = $this->input->post('nome', TRUE);
                $this->DAOAutor->insert_author($autor);

                Mensagem::setMensagemSucesso("Autor: <span class='bold'>" . $this->input->post('nome') . "</span> cadastrado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Atualiza dados do autor
     * 
     * @throws ExceptionValidacao
     */
    public function atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_AUTOR);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("nome", "Nome", "trim|required|min_length[4]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $autor = new TOAutor();
                $autor->id = $this->input->post('codigo', TRUE);
                $autor->nome = $this->input->post('nome', TRUE);
                $this->DAOAutor->update_author($autor);

                Mensagem::setMensagemSucesso("Autor: <span class='bold'>" . $autor->nome . "</span> atualizado com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Exclui autor
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_AUTOR);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[5]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $autor = new TOAutor();
                $autor->id = explode(',', $this->input->post('codigoDelete', TRUE)); // Monta array com os ids 
                $autor->nome = $this->input->post('nomeDelete', TRUE);
                
                $this->DAOAutor->delete_author($autor);

                $autor->nome != NULL ? Mensagem::setMensagemSucesso("Autor: <span class='bold'>" . $autor->nome . "</span> excluído com sucesso.") : Mensagem::setMensagemSucesso("Autores  excluídos com sucesso!");

                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Busca autor
     */
    public function buscar() {
        try {
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $autores = $this->DAOAutor->search_author($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOAutor->amount_search_author($searchterm);

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "autor/buscar/" . $this->order_by_name . "/" . $this->direction_name . '/' .$total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['autores'] = $autores;
            $data['quant_list'] = $total_pagina;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para essa pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'autor_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    /**
     * Função para selciocionar autor no auto_complete
     */
    public function auto_complete_author() {
        $autor = new TOAutor();
        $autor->nome = $this->input->get('term', TRUE);

        echo json_encode($this->DAOAutor->suggestion_author($autor));
    }

    private function view_list_autor() {
        $this->template->load(NULL, 'autor_list');
    }

}
